package br.com.drestranho.escola.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.drestranho.escola.dao.ChamadaDAO;
import br.com.drestranho.escola.dao.ChamadaItemDAO;
import br.com.drestranho.escola.dao.DisciplinaDAO;
import br.com.drestranho.escola.dao.DisciplinaNomeDAO;
import br.com.drestranho.escola.dao.MatriculaDAO;
import br.com.drestranho.escola.entity.Chamada;
import br.com.drestranho.escola.entity.ChamadaItem;
import br.com.drestranho.escola.entity.Disciplina;
import br.com.drestranho.escola.entity.DisciplinaNome;
import br.com.drestranho.escola.entity.Funcionario;
import br.com.drestranho.escola.entity.Matricula;

// Manager da tela manterDisciplinaList.xhtml, que exibe a tabela com Disciplinas
// 
@ManagedBean  
@SessionScoped
public class ManterChamadaManager implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@EJB
	DisciplinaDAO disciplinaDAO = new DisciplinaDAO();
	@EJB
	DisciplinaNomeDAO disciplinaNomeDAO = new DisciplinaNomeDAO();
//	@EJB
//	TurmaDAO turmaDAO = new TurmaDAO();

	@EJB
	ChamadaDAO chamadaDAO = new ChamadaDAO();
	@EJB
	ChamadaItemDAO chamadaItemDAO = new ChamadaItemDAO();
	@EJB
	MatriculaDAO matriculaDAO = new MatriculaDAO();

	List<Chamada> chamadas;
	List<ChamadaItem> chamadasItens;
	Chamada chamadaSelec ;
	ChamadaItem chamadaItemSelec;
	boolean modoInsert;
	Integer anoSelec=2012;
	String disciplinaNomeNomeSelec;
	List<Disciplina> disciplinas;
	Disciplina disciplinaSelec;
	
//	String turmaSelec;
	List<Funcionario> professores;
//	List<Turma> turmas;
	List<Integer> anos;
	List<DisciplinaNome> disciplinasNomes;
	List<String> disciplinasNomesNomes;
//	List<String> turmasNomes;
	List<String> professoresNomes;
	String turmaNomeSelec;
	String professorNomeSelec;
	
	public List<Chamada> getChamadas() {
		return chamadas;
	}
	
	public void setChamadas(List<Chamada> chamadas) {
		this.chamadas = chamadas;
	}
	
	public Chamada getChamadaSelec() {
		return chamadaSelec;
	}
	
	public void setChamadaSelec(Chamada chamadaSelec) {
		this.chamadaSelec = chamadaSelec;
	}
	
	public List<ChamadaItem> getChamadasItens() {
		return chamadasItens;
	}

	public void setChamadasItens(List<ChamadaItem> chamadasItens) {
		this.chamadasItens = chamadasItens;
	}

	public ChamadaItem getChamadaItemSelec() {
		return chamadaItemSelec;
	}

	public void setChamadaItemSelec(ChamadaItem chamadaItemSelec) {
		this.chamadaItemSelec = chamadaItemSelec;
	}

	public List<String> getProfessoresNomes() {
		return professoresNomes;
	}

	public void setProfessoresNomes(List<String> professoresNomes) {
		this.professoresNomes = professoresNomes;
	}

	public String getProfessorNomeSelec() {
		return professorNomeSelec;
	}

	public void setProfessorNomeSelec(String professorNomeSelec) {
		this.professorNomeSelec = professorNomeSelec;
	}

	public String getTurmaNomeSelec() {
		return turmaNomeSelec;
	}

	public void setTurmaNomeSelec(String turmaNomeSelec) {
		this.turmaNomeSelec = turmaNomeSelec;
	}

//	public List<String> getTurmasNomes() {
//		return turmasNomes;
//	}
//
//	public void setTurmasNomes(List<String> turmasNomes) {
//		this.turmasNomes = turmasNomes;
//	}
	
	public List<String> getDisciplinasNomesNomes() {
		return disciplinasNomesNomes;
	}

	public void setDisciplinasNomesNomes(List<String> disciplinasNomesNomes) {
		this.disciplinasNomesNomes = disciplinasNomesNomes;
	}

	public String getDisciplinaNomeNomeSelec() {
		return disciplinaNomeNomeSelec;
	}

	public void setDisciplinaNomeNomeSelec(String disciplinaNomeNomeSelec) {
		this.disciplinaNomeNomeSelec = disciplinaNomeNomeSelec;
	}

	@PostConstruct
	public void iniciarCombo() {
		System.out.println("*"+Perfil.funcionarioLogado.getNome());
		disciplinas = disciplinaDAO.getDisciplinasPorProfessor(Perfil.funcionarioLogado);//(ArrayList<Disciplina>) disciplinaDAO.getBeans();	
		Collections.sort(disciplinas, new ComparaDisciplina());		
		setModoInsert(false);
		disciplinasNomes = disciplinaNomeDAO.getBeans();
		disciplinasNomesNomes = new ArrayList<String>();//disciplinaNomeDAO.getNomes();
		for (Disciplina d : disciplinas) {
			disciplinasNomesNomes.add(d.getDisciplinaNome().getNome()+" "+d.getTurma().getSerie()+"ª "+d.getTurma().getDigito());
		}
	}
	// chamado para popular a tabela nao so na criacao como tambem quando seu conteudo eh mudado
	public void iniciarTabela() {
		chamadas = chamadaDAO.getBeans();//new ArrayList<Chamada>();
		anos = disciplinaDAO.carregaAnos();
//		turmas = turmaDAO.getBeans();
//		turmasNomes = new ArrayList<String>();
//		for (Turma t : turmas) {
//			turmasNomes.add(t.getSerie()+"ª "+t.getDigito());
//		}
			
	}
	
	public List<DisciplinaNome> getDisciplinasNomes() {
		return disciplinasNomes;
	}

	public void setDisciplinasNomes(List<DisciplinaNome> disciplinasNomes) {
		this.disciplinasNomes = disciplinasNomes;
	}

	public List<Integer> getAnos() {
		return anos;
	}

	public void setAnos(List<Integer> anos) {
		this.anos = anos;
	}

	public Integer getAnoSelec() {
		return anoSelec;
	}

	public void setAnoSelec(Integer anoSelec) {
		this.anoSelec = anoSelec;
	}


	public Disciplina getDisciplinaSelec() {
		return disciplinaSelec;
	}

	public void setDisciplinaSelec(Disciplina DisciplinaSelec) {
		this.disciplinaSelec = DisciplinaSelec;
	}

	public boolean getModoInsert() {
		return modoInsert;
	}

	public void setModoInsert(boolean modoInsert) {
		this.modoInsert = modoInsert;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}
	
	public void setDisciplinas(List<Disciplina> Disciplinas) {
		this.disciplinas = Disciplinas;
	}
	
	public String cadastrar() {
		Disciplina d = disciplinas.get(disciplinasNomesNomes.indexOf(disciplinaNomeNomeSelec));
		Chamada chamadaSelec = new Chamada();
		chamadaSelec.setData(new Date());
		chamadaSelec.setDisciplina(d);
		chamadaDAO.salvar(chamadaSelec);
		List<Matricula> matriculas = matriculaDAO.getChamada(d.getTurma().getId());
		chamadasItens = new ArrayList<ChamadaItem>();
		for (Matricula m : matriculas) {
			ChamadaItem ci = new ChamadaItem();
			ci.setMatricula(m);
			ci.setChamada(chamadaSelec);
			ci.setStatus(false);
			chamadaItemDAO.salvar(ci);
			chamadasItens.add(ci);
		}
		setModoInsert(true);
		System.out.println(chamadasItens.size()+"\n"+d.getTurma().getSerie()+d.getTurma().getDigito());
		return "manterChamadaForm";
	}
	
	public String editar() {
		setModoInsert(false);
		return "manterChamadaForm";
	}
	
	public String remover() {
		Disciplina f = disciplinaDAO.getBean(getDisciplinaSelec().getId());
		disciplinaSelec = null;
		disciplinaDAO.remover(f);
		iniciarTabela();
		return "";
	}
	
	public String salvar() {
		System.out.print("salvando "+disciplinaSelec.getId());
		System.out.print(professorNomeSelec+" "+professoresNomes.indexOf(professorNomeSelec));
		disciplinaSelec.setFuncionario( professores.get(professoresNomes.indexOf(professorNomeSelec)) );
		disciplinaSelec.setDisciplinaNome( disciplinasNomes.get(disciplinasNomesNomes.indexOf(disciplinaNomeNomeSelec)) );
//		disciplinaSelec.setTurma(turmas.get(turmasNomes.indexOf(turmaNomeSelec)));
//		disciplinaSelec.getFuncionario().getNome()
		disciplinaDAO.salvar(getDisciplinaSelec());
		iniciarTabela();// nova entidade foi inserida; refazer a tabela
		return "manterChamadaList";
	}
	
	public String atualizar() {
		System.out.print("atual  "+disciplinaSelec.getId());
		disciplinaDAO.atualizar(getDisciplinaSelec());
		return "manterChamadaList";
	}
	
	
	// Classe interna que ordena os Disciplinas por nome. ano decrescente, serie crescente
	public class ComparaDisciplina implements Comparator<Disciplina> {
		@Override
		public int compare(Disciplina turm1, Disciplina turm2) {
			return 0;
		}
	}
	
}